{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2023-09-25T01:45:49.971196700Z",
     "start_time": "2023-09-25T01:45:48.328193200Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "最佳验证集: {'svc__C': 1, 'svc__gamma': 1, 'svc__kernel': 'rbf'}\n",
      "验证集精度: 0.9812311901504789\n",
      "精度: 0.972\n"
     ]
    }
   ],
   "source": [
    "from sklearn.datasets import load_breast_cancer\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "X,y = load_breast_cancer(return_X_y=True)\n",
    "param = {'svc__kernel':['rbf','linear'],'svc__C':[0.001,0.01,0.1,1,10],'svc__gamma':[0.01,0.1,1,10,100]}\n",
    "X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=0,shuffle=True)\n",
    "svc_classification = SVC(kernel='rbf')\n",
    "svc_pipe = Pipeline([('scaler',MinMaxScaler()),('svc',svc_classification)])\n",
    "grid = GridSearchCV(svc_pipe,param_grid=param)\n",
    "grid.fit(X_train,y_train)\n",
    "print(\"最佳验证集:\",grid.best_params_)\n",
    "print(\"验证集精度:\",grid.best_score_)\n",
    "print(\"精度:\",round(grid.score(X_test,y_test),3))"
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "# 预测手机价位"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[8.420e+02 0.000e+00 2.200e+00 0.000e+00 1.000e+00 0.000e+00 7.000e+00\n",
      "  6.000e-01 1.880e+02 2.000e+00 2.000e+00 2.000e+01 7.560e+02 2.549e+03\n",
      "  9.000e+00 7.000e+00 1.900e+01 0.000e+00 0.000e+00 1.000e+00 1.000e+00]\n",
      " [1.021e+03 1.000e+00 5.000e-01 1.000e+00 0.000e+00 1.000e+00 5.300e+01\n",
      "  7.000e-01 1.360e+02 3.000e+00 6.000e+00 9.050e+02 1.988e+03 2.631e+03\n",
      "  1.700e+01 3.000e+00 7.000e+00 1.000e+00 1.000e+00 0.000e+00 2.000e+00]\n",
      " [5.630e+02 1.000e+00 5.000e-01 1.000e+00 2.000e+00 1.000e+00 4.100e+01\n",
      "  9.000e-01 1.450e+02 5.000e+00 6.000e+00 1.263e+03 1.716e+03 2.603e+03\n",
      "  1.100e+01 2.000e+00 9.000e+00 1.000e+00 1.000e+00 0.000e+00 2.000e+00]\n",
      " [6.150e+02 1.000e+00 2.500e+00 0.000e+00 0.000e+00 0.000e+00 1.000e+01\n",
      "  8.000e-01 1.310e+02 6.000e+00 9.000e+00 1.216e+03 1.786e+03 2.769e+03\n",
      "  1.600e+01 8.000e+00 1.100e+01 1.000e+00 0.000e+00 0.000e+00 2.000e+00]\n",
      " [1.821e+03 1.000e+00 1.200e+00 0.000e+00 1.300e+01 1.000e+00 4.400e+01\n",
      "  6.000e-01 1.410e+02 2.000e+00 1.400e+01 1.208e+03 1.212e+03 1.411e+03\n",
      "  8.000e+00 2.000e+00 1.500e+01 1.000e+00 1.000e+00 0.000e+00 1.000e+00]]\n",
      "---------------------------\n",
      "[[1.000e+00 1.043e+03 1.000e+00 1.800e+00 1.000e+00 1.400e+01 0.000e+00\n",
      "  5.000e+00 1.000e-01 1.930e+02 3.000e+00 1.600e+01 2.260e+02 1.412e+03\n",
      "  3.476e+03 1.200e+01 7.000e+00 2.000e+00 0.000e+00 1.000e+00 0.000e+00]\n",
      " [2.000e+00 8.410e+02 1.000e+00 5.000e-01 1.000e+00 4.000e+00 1.000e+00\n",
      "  6.100e+01 8.000e-01 1.910e+02 5.000e+00 1.200e+01 7.460e+02 8.570e+02\n",
      "  3.895e+03 6.000e+00 0.000e+00 7.000e+00 1.000e+00 0.000e+00 0.000e+00]\n",
      " [3.000e+00 1.807e+03 1.000e+00 2.800e+00 0.000e+00 1.000e+00 0.000e+00\n",
      "  2.700e+01 9.000e-01 1.860e+02 3.000e+00 4.000e+00 1.270e+03 1.366e+03\n",
      "  2.396e+03 1.700e+01 1.000e+01 1.000e+01 0.000e+00 1.000e+00 1.000e+00]\n",
      " [4.000e+00 1.546e+03 0.000e+00 5.000e-01 1.000e+00 1.800e+01 1.000e+00\n",
      "  2.500e+01 5.000e-01 9.600e+01 8.000e+00 2.000e+01 2.950e+02 1.752e+03\n",
      "  3.893e+03 1.000e+01 0.000e+00 7.000e+00 1.000e+00 1.000e+00 0.000e+00]\n",
      " [5.000e+00 1.434e+03 0.000e+00 1.400e+00 0.000e+00 1.100e+01 1.000e+00\n",
      "  4.900e+01 5.000e-01 1.080e+02 6.000e+00 1.800e+01 7.490e+02 8.100e+02\n",
      "  1.773e+03 1.500e+01 8.000e+00 7.000e+00 1.000e+00 0.000e+00 1.000e+00]]\n",
      "(1000, 21)\n",
      "(2000, 21)\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "filename = r'F:\\机器学习数据集\\phone_train.csv'\n",
    "with open(filename,encoding='utf-8') as f1:\n",
    "    X1 = np.loadtxt(f1,skiprows=1,delimiter=',')\n",
    "    print(X1[:5])\n",
    "\n",
    "print(\"---------------------------\")\n",
    "filename_pred = r'F:\\机器学习数据集\\phone_test.csv'\n",
    "with open(filename_pred,encoding='utf-8') as f2:\n",
    "    X2 = np.loadtxt(f2,skiprows=1,delimiter=',')\n",
    "    print(X2[:5])\n",
    "\n",
    "print(X2.shape)\n",
    "print(X1.shape)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-26T05:54:59.406402500Z",
     "start_time": "2023-09-26T05:54:58.415415800Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1 2 2 ... 3 0 3]\n"
     ]
    }
   ],
   "source": [
    "X,y = X1[:,:-1],X1[:,-1]\n",
    "y = y.astype(int)\n",
    "print(y)\n",
    "X2 = X2[:,1:]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-26T05:55:55.073533300Z",
     "start_time": "2023-09-26T05:55:54.958604500Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "验证集最好参数 {'svc__C': 10, 'svc__gamma': 0.01, 'svc__kernel': 'rbf'}\n",
      "验证集精度 0.903\n",
      "测试集精度 0.922\n"
     ]
    }
   ],
   "source": [
    "from sklearn.decomposition import PCA\n",
    "from sklearn.feature_selection import SelectKBest\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25,random_state=0)\n",
    "svc_classification = SVC()\n",
    "param = {'svc__kernel':['rbf'],'svc__C':[0.001,0.01,0.1,1,10],'svc__gamma':[0.01,0.1,1,10,100]}\n",
    "pca = PCA(n_components=10)\n",
    "svc_pipe = Pipeline([('scaler',MinMaxScaler()),('svc',svc_classification)])\n",
    "grid = GridSearchCV(svc_pipe,param_grid=param,n_jobs=-1)\n",
    "grid.fit(X_train,y_train)\n",
    "print(\"验证集最好参数\",grid.best_params_)\n",
    "print(\"验证集精度\",round(grid.best_score_,3))\n",
    "print(\"测试集精度\",round(grid.score(X_test,y_test),3))\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-25T03:04:34.153440600Z",
     "start_time": "2023-09-25T03:04:31.061444200Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "outputs": [
    {
     "data": {
      "text/plain": "array([3, 3, 2, 3, 1, 3, 3, 1, 3, 0, 3, 3, 0, 0, 2, 0, 2, 1, 3, 2, 1, 3,\n       1, 1, 3, 0, 2, 0, 3, 0, 2, 0, 3, 0, 1, 1, 3, 1, 2, 1, 1, 2, 0, 0,\n       0, 1, 0, 3, 1, 2, 1, 0, 2, 0, 3, 0, 3, 1, 1, 3, 3, 2, 0, 1, 1, 1,\n       2, 3, 1, 2, 1, 2, 2, 3, 3, 0, 2, 0, 2, 3, 0, 3, 3, 0, 3, 0, 3, 1,\n       3, 0, 1, 1, 2, 1, 2, 1, 0, 2, 1, 2, 1, 0, 0, 3, 0, 2, 0, 1, 2, 3,\n       3, 3, 1, 3, 3, 3, 3, 2, 3, 0, 0, 3, 2, 1, 2, 0, 3, 2, 2, 1, 0, 2,\n       2, 1, 3, 1, 1, 0, 3, 2, 1, 2, 1, 2, 2, 3, 3, 3, 2, 3, 2, 3, 1, 0,\n       3, 2, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 1, 0, 3, 0, 0, 0, 1, 1, 0, 1,\n       0, 0, 1, 2, 1, 0, 0, 1, 1, 2, 1, 1, 0, 0, 0, 1, 0, 3, 1, 0, 2, 2,\n       3, 3, 1, 2, 2, 3, 3, 2, 2, 1, 1, 0, 1, 3, 1, 2, 3, 3, 0, 2, 0, 3,\n       2, 3, 3, 1, 0, 1, 0, 3, 0, 1, 0, 2, 2, 1, 3, 1, 3, 0, 3, 1, 2, 0,\n       0, 2, 1, 3, 2, 3, 1, 1, 3, 0, 0, 2, 3, 3, 1, 3, 1, 1, 3, 2, 1, 2,\n       3, 3, 3, 1, 0, 0, 2, 3, 1, 1, 3, 2, 0, 3, 0, 1, 2, 0, 0, 3, 2, 3,\n       3, 2, 1, 3, 3, 2, 3, 1, 2, 1, 2, 0, 2, 3, 1, 0, 0, 3, 0, 3, 0, 1,\n       2, 0, 2, 3, 1, 3, 2, 2, 1, 2, 0, 0, 0, 1, 3, 2, 0, 1, 0, 3, 2, 0,\n       2, 3, 1, 2, 2, 2, 3, 1, 3, 3, 2, 2, 2, 3, 3, 1, 3, 0, 3, 1, 3, 1,\n       2, 3, 0, 1, 0, 3, 1, 3, 2, 3, 0, 0, 0, 0, 2, 0, 0, 2, 2, 1, 2, 2,\n       2, 0, 1, 0, 0, 3, 2, 0, 3, 1, 2, 2, 1, 2, 3, 1, 1, 2, 2, 1, 2, 0,\n       1, 1, 0, 3, 2, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 2, 2, 3, 2, 3, 0, 3,\n       0, 3, 0, 1, 1, 0, 1, 0, 3, 2, 3, 3, 1, 3, 1, 3, 1, 2, 2, 0, 1, 2,\n       1, 1, 0, 0, 0, 1, 2, 1, 0, 3, 2, 0, 2, 3, 0, 0, 3, 1, 1, 0, 2, 3,\n       3, 0, 3, 0, 2, 3, 2, 3, 0, 2, 0, 2, 2, 0, 1, 1, 0, 0, 1, 1, 1, 3,\n       3, 3, 2, 3, 1, 2, 2, 3, 3, 3, 2, 0, 2, 1, 2, 2, 1, 0, 2, 2, 0, 0,\n       0, 3, 1, 0, 2, 2, 2, 0, 3, 1, 2, 2, 1, 3, 0, 2, 3, 0, 1, 1, 3, 3,\n       1, 1, 1, 3, 2, 0, 3, 0, 2, 0, 3, 3, 1, 3, 2, 2, 3, 0, 1, 2, 3, 1,\n       3, 2, 3, 1, 1, 0, 0, 3, 2, 0, 3, 2, 3, 3, 0, 3, 3, 3, 2, 3, 3, 1,\n       2, 0, 2, 2, 3, 1, 0, 1, 1, 2, 2, 2, 0, 0, 2, 2, 3, 2, 0, 2, 1, 3,\n       3, 0, 1, 3, 0, 2, 1, 1, 0, 0, 2, 1, 0, 1, 1, 2, 2, 0, 2, 2, 1, 0,\n       3, 0, 0, 3, 2, 0, 0, 1, 0, 0, 3, 0, 3, 0, 3, 2, 1, 3, 2, 0, 1, 0,\n       3, 2, 2, 2, 1, 3, 0, 2, 0, 2, 0, 0, 1, 1, 1, 2, 1, 3, 1, 3, 2, 2,\n       1, 3, 2, 0, 2, 2, 0, 3, 3, 0, 2, 1, 1, 2, 0, 3, 2, 0, 3, 2, 3, 0,\n       0, 3, 0, 1, 2, 3, 2, 2, 2, 2, 1, 2, 3, 0, 1, 0, 1, 2, 1, 0, 0, 1,\n       0, 0, 3, 0, 1, 2, 0, 1, 0, 1, 3, 0, 3, 2, 3, 0, 0, 1, 2, 1, 1, 0,\n       1, 1, 0, 1, 1, 0, 0, 3, 3, 0, 3, 1, 1, 3, 0, 1, 0, 2, 2, 0, 3, 1,\n       0, 3, 1, 1, 0, 3, 3, 3, 2, 3, 0, 3, 2, 0, 1, 0, 3, 3, 2, 0, 2, 1,\n       3, 0, 0, 2, 2, 0, 3, 1, 2, 1, 1, 1, 3, 1, 1, 1, 2, 1, 0, 2, 2, 0,\n       2, 0, 0, 0, 0, 2, 3, 3, 3, 0, 1, 2, 1, 1, 0, 0, 2, 1, 0, 2, 0, 3,\n       2, 2, 1, 2, 0, 2, 1, 3, 0, 0, 3, 2, 3, 0, 0, 2, 3, 3, 1, 3, 2, 1,\n       0, 0, 2, 3, 1, 3, 0, 0, 0, 2, 2, 1, 2, 0, 3, 2, 1, 2, 3, 3, 0, 1,\n       1, 2, 1, 2, 2, 0, 1, 3, 1, 1, 3, 0, 2, 3, 2, 1, 1, 1, 3, 3, 0, 2,\n       3, 0, 2, 3, 2, 2, 2, 3, 2, 0, 1, 2, 1, 2, 1, 1, 2, 2, 2, 1, 2, 1,\n       0, 1, 3, 1, 0, 1, 2, 3, 1, 0, 0, 3, 2, 2, 3, 0, 3, 2, 2, 1, 3, 0,\n       1, 3, 1, 1, 1, 2, 3, 2, 0, 3, 0, 2, 3, 0, 3, 1, 3, 3, 1, 0, 2, 3,\n       1, 0, 2, 1, 2, 1, 2, 0, 2, 2, 0, 2, 3, 2, 3, 0, 2, 1, 1, 2, 2, 3,\n       3, 0, 2, 1, 2, 1, 3, 1, 0, 3, 0, 1, 0, 0, 3, 3, 2, 0, 0, 0, 0, 3,\n       2, 3, 3, 0, 0, 2, 1, 0, 2, 2])"
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "svc_ultimate = SVC(kernel='rbf',C=10,gamma=0.01)\n",
    "pipe_ultimate = Pipeline([('scaler',MinMaxScaler()),(\"svc_ultimate\",svc_ultimate)])\n",
    "pipe_ultimate.fit(X,y.astype(int))\n",
    "pipe_ultimate.predict(X2)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-25T03:01:43.436231400Z",
     "start_time": "2023-09-25T03:01:43.226239100Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "最好的参数 {'max_features': 0.75, 'n_estimators': 80}\n",
      "验证集精度 0.903\n",
      "测试集精度 0.899\n"
     ]
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "param = {'n_estimators':[50,60,80,100],'max_features':[0.5,0.75,0.85,1]}\n",
    "rf =RandomForestClassifier(random_state=0,oob_score=True)\n",
    "grid_rf = GridSearchCV(rf,param_grid=param,n_jobs=-1,refit=True)\n",
    "grid_rf.fit(X,y.astype(int))\n",
    "print(\"最好的参数\",grid_rf.best_params_)\n",
    "print(\"验证集精度\",round(grid_rf.best_score_,3))\n",
    "print(\"测试集精度\",round(grid_rf.best_estimator_.oob_score_,3))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-25T03:57:39.948081600Z",
     "start_time": "2023-09-25T03:57:31.315086700Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "最好参数: {'learning_rate': 0.1, 'max_depth': 2, 'n_estimators': 300}\n",
      "最好的验证集精度: 0.907\n",
      "测试集精度: 0.92\n"
     ]
    }
   ],
   "source": [
    "# 使用梯度提升树\n",
    "from sklearn.ensemble import GradientBoostingClassifier\n",
    "from sklearn.model_selection import train_test_split,GridSearchCV\n",
    "gbrt_params = {'n_estimators':[100,300,500],'learning_rate':[0.01,0.1,1,10],'max_depth':[2,3,4,5]}\n",
    "gbrt = GradientBoostingClassifier()\n",
    "grid_gbrt = GridSearchCV(gbrt,param_grid=gbrt_params,n_jobs=-1)\n",
    "X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25,random_state=0)\n",
    "grid_gbrt.fit(X_train,y_train)\n",
    "print('最好参数:',grid_gbrt.best_params_)\n",
    "print(\"最好的验证集精度:\",round(grid_gbrt.best_score_,3))\n",
    "print(\"测试集精度:\",round(grid_gbrt.score(X_test,y_test),3))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-26T06:17:55.481869700Z",
     "start_time": "2023-09-26T06:13:48.832389200Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练集: 1.0\n",
      "测试集: 0.942\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "E:\\myAnaconda\\lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (800) reached and the optimization hasn't converged yet.\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "source": [
    "# 使用神经网络解决手机定价问题\n",
    "# 查看神经网络拟合性能\n",
    "from sklearn.neural_network import MLPClassifier\n",
    "from sklearn.preprocessing import MinMaxScaler,StandardScaler\n",
    "scaler = MinMaxScaler()\n",
    "scaler.fit(X_train)\n",
    "X_train_scaler = scaler.transform(X_train)\n",
    "X_test_scaler = scaler.transform(X_test)\n",
    "\n",
    "mlp_classifier = MLPClassifier(max_iter=800)\n",
    "mlp_classifier.fit(X_train_scaler,y_train)\n",
    "print(\"训练集:\",mlp_classifier.score(X_train_scaler,y_train))\n",
    "print('测试集:',mlp_classifier.score(X_test_scaler,y_test))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-26T08:30:00.994691100Z",
     "start_time": "2023-09-26T08:29:51.869697100Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "最佳参数组合: {'mlp__activation': 'tanh', 'mlp__hidden_layer_sizes': (100,)}\n",
      "最佳验证集得分 0.9673333333333334\n",
      "最佳测试集 0.954\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "E:\\myAnaconda\\lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "source": [
    "from sklearn.pipeline import Pipeline\n",
    "# 尝试找出最佳参数\n",
    "mlp_param = {#\"learning_rate\":[0.01,0.1,1],\n",
    "             'mlp__activation':['relu','tanh'],\n",
    "             'mlp__hidden_layer_sizes':[(100,),(100,100,50),(21,100),(21,100,30)]}\n",
    "mlp = MLPClassifier(max_iter=500,random_state=0)\n",
    "pipe = Pipeline([('scaler',MinMaxScaler()),('mlp',mlp)])\n",
    "grid_mlp = GridSearchCV(pipe,param_grid=mlp_param,n_jobs=-1)\n",
    "grid_mlp.fit(X_train_scaler,y_train)\n",
    "print(\"最佳参数组合:\",grid_mlp.best_params_)\n",
    "print(\"最佳验证集得分\",grid_mlp.best_score_)\n",
    "print(\"最佳测试集\",grid_mlp.score(X_test_scaler,y_test))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-26T09:18:57.451392700Z",
     "start_time": "2023-09-26T09:18:09.505425600Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
